package com.smarthome.common.tools;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

/**
 * <B>Description</B> spring工具类 <br />
 * 需要在spring-config.xml中配置bean:<br />
 * &lt;bean id="springUtils"
 * class="com.smarthome.common.tools.SpringUtils"/> <br />
 * <br />
 * <B>Copyright</B> Copyright (c) 2015 www.smarthome.com All rights reserved. <br />
 * 本软件源代码版权归xxxx公司,未经许可不得任意复制与传播.<br />
 * <B>Company</B> xxxx公司
 * @createTime 2015年8月5日 下午6:22:58
 * @author KongXiangyu
 */
public final class SpringUtils implements BeanFactoryPostProcessor {

    private static ConfigurableListableBeanFactory beanFactory; // Spring应用上下文环境

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        SpringUtils.beanFactory = beanFactory;
    }

    /**
     * 获取对象
     * @param name
     * @return Object 一个以给定名字注册的bean的实例
     * @throws BeansException
     * @createTime 2015年8月5日 下午6:19:57
     * @author KongXiangyu
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
        return (T) beanFactory.getBean(name);
    }

    /**
     * 获取类型为返回类型的对象
     * @param clazz
     * @return
     * @throws BeansException
     * @createTime 2015年8月5日 下午6:20:23
     * @author KongXiangyu
     */
    public static <T> T getBean(Class<T> clazz) throws BeansException {
        T result = (T) beanFactory.getBean(clazz);
        return result;
    }

    /**
     * 如果BeanFactory包含一个与所给名称匹配的bean定义，则返回true
     * @param name
     * @return
     * @createTime 2015年8月5日 下午6:21:09
     * @author KongXiangyu
     */
    public static boolean containsBean(String name) {
        return beanFactory.containsBean(name);
    }

    /**
     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
     * 如果与给定名字相应的bean定义没有被找到，将会抛出一个异常（NoSuchBeanDefinitionException）
     * @param name
     * @return
     * @throws NoSuchBeanDefinitionException
     * @createTime 2015年8月5日 下午6:21:26
     * @author KongXiangyu
     */
    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.isSingleton(name);
    }

    /**
     * 
     * @param name
     * @return Class 注册对象的类型
     * @throws NoSuchBeanDefinitionException
     * @createTime 2015年8月5日 下午6:22:12
     * @author KongXiangyu
     */
    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.getType(name);
    }

    /**
     * 返回指定Bean的别名，若没有则抛出NoSuchBeanDefinitionException异常
     * @param name
     * @return
     * @throws NoSuchBeanDefinitionException
     * @createTime 2015年8月5日 下午6:22:28
     * @author KongXiangyu
     */
    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.getAliases(name);
    }

    public static Object getBean(CharSequence springId) {
        return null;
    }
    
    public static ConfigurableListableBeanFactory getBeanFactory(){
    	return beanFactory;
    }

}
